package com.easy.interceptor;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.easy.util.Result;
import com.easy.util.SYS;
import com.easy.util.TokenUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

//拦截器
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求的token
        String token = request.getHeader(SYS.TOKEN_AUTHORIZATION);
        //判断 token 是否存在且有效
        if (token == null || !TokenUtil.veify(token)) {
            Result result = new Result(401, "认证异常", null);
            String json = JSONUtil.toJsonStr(result);
            response.getWriter().print(json);
            return false;
        }

        // 解析token中的用户信息
        Object roleObj = TokenUtil.getOption(token, SYS.TOKEN_KEY_ROLE);
        Object idObj = TokenUtil.getOption(token, SYS.TOKEN_KEY_ID);

        if (roleObj == null || idObj == null) {
            Result result = new Result(403, "权限不足", null);
            String json = JSONUtil.toJsonStr(result);
            response.getWriter().print(json);
            return false;
        }

        // 将用户信息存储在request中，供后续使用
        request.setAttribute("userRole", roleObj.toString());
        request.setAttribute("userId", Integer.parseInt(idObj.toString()));

        // 获取请求路径
        String requestURI = request.getRequestURI();

        // 输出调试信息
        System.out.println("请求URI: " + requestURI);
        System.out.println("用户角色: " + roleObj.toString());
        System.out.println("用户ID: " + idObj.toString());

        // 管理员可以访问所有接口
        if ("admin".equals(roleObj.toString())) {
            System.out.println("管理员访问，允许通过");
            return true;
        }

        // 用户访问控制 - 只能访问特定接口或与自己相关的数据
        // 用户可以访问登录相关接口
        if (requestURI.startsWith("/login")) {
            System.out.println("登录相关接口，允许通过");
            return true;
        }

        // 用户可以访问用户相关接口
        if (requestURI.startsWith("/user")) {
            System.out.println("用户相关接口，允许通过");
            return true;
        }

        // 允许普通用户访问景点相关接口（只读）
        if (requestURI.startsWith("/attraction") &&
                (request.getMethod().equals("GET") || request.getMethod().equals("HEAD"))) {
            System.out.println("景点只读接口，允许通过");
            return true;
        }

        // 允许普通用户访问评论相关接口（只读）
        if (requestURI.startsWith("/review") &&
                (request.getMethod().equals("GET") || request.getMethod().equals("HEAD"))) {
            System.out.println("评论只读接口，允许通过");
            return true;
        }

        if (requestURI.startsWith("/review") && request.getMethod().equals("POST")) {
            System.out.println("评论POST接口，允许通过");
            return true;
        }

        // 允许普通用户编辑和删除评论（具体权限在Controller中控制）
        if (requestURI.startsWith("/review") &&
                (request.getMethod().equals("PUT") || request.getMethod().equals("DELETE"))) {
            System.out.println("评论编辑/删除接口，允许通过");
            return true;
        }

        // 允许普通用户操作收藏夹
        if (requestURI.startsWith("/favorites")) {
            System.out.println("收藏夹接口，允许通过");
            return true;
        }

        // 允许普通用户操作行程
        if (requestURI.startsWith("/itinerary")) {
            System.out.println("行程接口，允许通过");
            return true;
        }

        // 允许普通用户操作用户活动
        if (requestURI.startsWith("/user_activity") || requestURI.startsWith("/api/itinerary")) {
            System.out.println("用户活动接口，允许通过");
            return true;
        }

        if(requestURI.startsWith("/notification")){
            System.out.println("通知接口，允许通过");
            return true;
        }

     // 允许普通用户访问AI聊天接口
if (requestURI.startsWith("/api/ai") || requestURI.startsWith("/ai/") || requestURI.startsWith("/v1/ai/")) {
    System.out.println("AI聊天接口，允许通过");
    return true;
}
        // 允许普通用户访问轮播图接口（只读）
        if (requestURI.startsWith("/carousel/list") || requestURI.startsWith("/carousel/") &&
                (request.getMethod().equals("GET") || request.getMethod().equals("HEAD"))) {
            System.out.println("轮播图只读接口，允许通过");
            return true;
        }
        // 允许访问错误处理路径
        if (requestURI.startsWith("/error")) {
            System.out.println("错误处理接口，允许通过");
            return true;
        }

        // 用户访问其他接口需要具体判断
        System.out.println("未匹配到允许的接口，拒绝访问");
        Result result = new Result(403, "权限不足", null);
        String json = JSONUtil.toJsonStr(result);
        response.getWriter().print(json);
        return false;
    }
}
